package com.example.io;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务端
 */
public class ServerDemo {
    public static void main(String[] args) throws Exception {
        // demo1();
        // demo2();
        demo3();
    }

    /**
     * 服务器端，单个一对一接收
     *  报错时，可以简单理解为 client 离线
     */
    public static void demo1() throws IOException {
        System.out.println("==服务器的启动==");
        // （1）注册端口
        ServerSocket serverSocket = new ServerSocket(8888);
        //（2）开始在这里暂停等待接收客户端的连接,得到一个端到端的Socket管道
        Socket socket = serverSocket.accept();
        //（3）从Socket管道中得到一个字节输入流。
        InputStream is = socket.getInputStream();
        //（4）把字节输入流包装成自己需要的流进行数据的读取。
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        //（5）读取数据
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println("服务端收到：" + line);
        }
    }
    /**
     * 服务器端，单个 收、发
     *  一对一应答
     */
    public static void demo2() throws IOException {
        System.out.println("==服务器的启动==");
        // （1）注册端口
        ServerSocket serverSocket = new ServerSocket(8888);
        //（2）开始在这里暂停等待接收客户端的连接,得到一个端到端的Socket管道
        Socket socket = serverSocket.accept();
        //（3）从Socket管道中得到一个字节输入流。
        InputStream is = socket.getInputStream();
        //（4）把字节输入流包装成自己需要的流进行数据的读取。
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        //（5）读取数据，并输出
        OutputStream out = socket.getOutputStream();
        PrintStream ps = new PrintStream(out);
        String line;
        while ((line = br.readLine()) != null) {
            // System.out.println("服务端收到：" + line);
            ps.println(line + " + 1");
            ps.flush();
        }
    }

    /**
     * 服务器端
     *  一对多 应答
     */
    public static void demo3() throws IOException {
        System.out.println("==服务器的启动==");
        // （1）注册端口
        ServerSocket serverSocket = new ServerSocket(8888);
        while (true) {
            //（2）开始在这里暂停等待接收客户端的连接,得到一个端到端的Socket管道
            Socket socket = serverSocket.accept();
            new Thread(() -> {
                try {
                    System.out.println(socket.getRemoteSocketAddress());
                    //（3）从Socket管道中得到一个字节输入流。
                    InputStream is = socket.getInputStream();
                    //（4）把字节输入流包装成自己需要的流进行数据的读取。
                    BufferedReader br = new BufferedReader(new InputStreamReader(is));
                    //（5）读取数据，并输出
                    OutputStream out = socket.getOutputStream();
                    PrintStream ps = new PrintStream(out);
                    String line;
                    while ((line = br.readLine()) != null) {
                        System.out.println("服务端收到：" + line);
                        ps.println(line + " + 1");
                        ps.flush();
                    }
                } catch (Exception e){e.printStackTrace();}
            }).start();
        }
    }
}
